﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Web.Helpers;
using System.IO;


namespace TumbaloSoft.Controllers
{
    public class SuInmuebleController : Controller
    {
        private static Object lockObject = new Object();
        //
        // GET: /Inmueble/

        //INDEX
        public ActionResult Index()
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la pagina", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        [HttpPost]
        public ActionResult Index(string tipoPersona)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                if (tipoPersona == "N") return RedirectToAction("RegistrarNatural");
                else return RedirectToAction("RegistrarJuridica");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la pagina", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }
        
        //REGISTRAR PERSONA NATURAL

        public ActionResult RegistrarNatural()
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar la persona natural", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }

        [HttpPost]
        public ActionResult RegistrarNatural(PersonaNatural persona)
        {
            try{
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                Boolean existe = HelperPersonaNatural.ExistePersona(persona.prCodigoDocumento);
                if (existe == true)
                {
                    ModelState.AddModelError("prCodigoDocumento", "Usted ya esta registrado, proceda al segundo paso");
                    persona.prIdPersona = HelperPersonaNatural.Codigo(persona.prCodigoDocumento);
                    PersonaNatural per = HelperPersonaNatural.selectById(persona.prIdPersona);
                    per.prIdTipoPersona = 2;//DUENHO;
                    HelperPersonaNatural.update(per);
                    return View(per);
                }
                else if (ModelState.IsValid && existe==false)
                {
                    Boolean esMayor = EsMayorEdad(persona.prFechaNacimiento);
                    if (esMayor == false)
                    {
                        ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                        return View(persona);
                    }
                    persona.prEstado = "ACTIVO";
                    persona.prIdTipoPersona = 2;//ES EL DUENHO
                    lock (lockObject)
                    {
                        persona.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                        HelperPersonaNatural.insert(persona);
                    }
                    return View(persona);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar la persona natural", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View(persona);
        }


        //REGISTRAR PERSONAJURIDICA

        public ActionResult RegistrarJuridica()
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar la persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        [HttpPost]
        public ActionResult RegistrarJuridica(PersonaJuridica personaJuridica)
        {           
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                if (personaJuridica.prRuc == null)
                {
                    ModelState.AddModelError("prRuc", "Se requiere saber el Ruc");
                    return View(personaJuridica);
                }
                Boolean existe = HelperPersonaJuridica.ExistePersona(personaJuridica.prRuc);

                if (existe == true)
                {
                    ModelState.AddModelError("prRuc", "Usted ya esta registrado, proceda al segundo paso");
                    personaJuridica.prIdPersona = HelperPersonaJuridica.Codigo(personaJuridica.prRuc);
                    PersonaJuridica per = HelperPersonaJuridica.selectById(personaJuridica.prIdPersona);
                    per.prIdTipoPersona = 2;//DUENHO;
                    HelperPersonaJuridica.update(per);
                    return View(per);
                }
                else if (ModelState.IsValid && existe == false)
                {
                    personaJuridica.prIdTipoPersona = 2;
                    personaJuridica.prEstado = "ACTIVO";
                    lock (lockObject)
                    {
                        personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                        HelperPersonaJuridica.insert(personaJuridica);
                    }
                    return View(personaJuridica);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar la persona juridica", ex);
              return View("~/Views/Shared/Error.cshtml");
            }

            return View(personaJuridica);

        }


        //REGISTRAR INMUEBLE
        public ActionResult RegistrarI()
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }

        [HttpPost]
        public ActionResult RegistrarI(int? prIdPersona, Inmueble inmueble)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
			  List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }

                ViewBag.listaMoneda = HelperMoneda.selectAll();
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                //inmueble.prEstado = "REGISTRADO";
                inmueble.prEstado = "POR APROBAR";                           
                var image = WebImage.GetImageFromRequest();
                var filename = Path.GetFileName(image.FileName);
                var path = Path.Combine(Server.MapPath("../Imagenes/Inmuebles/"), filename);
                image.Save(path);
                inmueble.prImagen = Url.Content(Path.Combine("../Imagenes/Inmuebles/", filename));
                
                if (!prIdPersona.HasValue)
                {
                    ViewBag.mensaje="Debe de ingresar sus datos personales";
                    return View("~/Views/Shared/Error.cshtml");
                }
                else if (ModelState.IsValid)
                {
                    lock (lockObject)
                    {
                        inmueble.prIdInmueble = HelperInmueble.SiguienteCodigo();
                        inmueble.prDuenho = new Persona();
                        inmueble.prDuenho.prIdPersona = (int)prIdPersona;
                        HelperInmueble.insert(inmueble);

                    }
                    ViewBag.mensaje = "Se registro correctamente el inmueble";
                    ViewBag.returnURL = "/Home";
                    return View("~/Views/Shared/Exito.cshtml");
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View(inmueble);
        }


        public Boolean EsMayorEdad(DateTime fechaNacimiento)
        {
            try
            {
                int edad = DateTime.Today.Year - fechaNacimiento.Year;
                if (new DateTime(DateTime.Today.Year, fechaNacimiento.Month, fechaNacimiento.Day) > DateTime.Today) edad--;
                if (edad > 18 && edad < 65) return true;
                else return false;
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar el inmueble", ex);
                return false;
            }
        }
    }
}
    